package main

import "fmt"
func main(){
	//定义数组
	/* var intarr [6]int = [6]int{1,2,3,4,5,6}
	//切片构建在数组之上：
	//定义一个切片名字为slice,[]动态变化的数组长度不写，int类型，intarr是原数组
	//[1:3]切片- 切出一段片段 - 索引：从1开始，到3结束（不包括3） - [1,3)
	//var slice []int = intarr[1:3]
	slice := intarr[1:3]
	//输出数组
	fmt.Println("intarr",intarr)
	//输出切片
	fmt.Println("slice",slice)
	//切片元素个数
	fmt.Println(len(slice)) //2
	//获取切片容量：容量可以动态变化
	fmt.Println(cap(slice)) //5
 */
	//切片的创建：
	//方法1：定义一个切片，让切片去引用一个已经创建好的数组
/* 	var intarr [6]int = [6]int{1,2,3,4,5,6}
	slice := intarr[1:3] */

	//方法2：通过make内置函数来创建切片
	//语法：var 切片名 [type = make([],len,[cap])]
	//make函数的三个参数：1.切片类型 2.切片长度 3.切片容量
	/* slice := make([]int,4,20)
	fmt.Println(slice) // [0 0 0 0]
	fmt.Println("切片的长度: ",len(slice)) // 4
	fmt.Println("切片的容量: ",cap(slice)) // 20
	slice[0] = 66
	slice[2] = 99
	fmt.Println(slice) */

	//方法3：定义一个切片，直接赋值，使用原理类似make的方式
	/* slice :=[]int{1,4,9}
	fmt.Println(slice) //[1 4 9]
	fmt.Println(len(slice)) // 3
	fmt.Println(cap(slice)) // 3 */

	//切片的遍历
	//定义：
	/* slice := []int{78,89,7,8,3,2}
	//方式1：for循环
	for i:= 0;i<len(slice);i++{
		fmt.Printf("slice[%v] = %v\t",i,slice[i])
	}
	fmt.Println("--------------")
	//方式2：for range
	for i,v:=range slice {
		fmt.Printf("下标：%v ,元素：%v\n",i,v)
	} */

	//切片的注意事项
	//1.切片定义后不能直接使用，需要让其引用到一个数组
	var slice[]int
	fmt.Println(slice) //[] - 无意义
	//2.切片访问不能越界
	var arr [5]int = [5]int{1,2,3,4,5} 
	slice1 := arr[1:4]
	fmt.Println(slice1) // [2 3 4]
	//fmt.Println(slice1[3]) //越界访问
	//3.简写
	/* var slice2 = arr[:]
	fmt.Println(slice2) */
	//4.切片可以继续切片
	slice2 := slice1[1:2]
	fmt.Println(slice2) // [3]
	slice2 [0] = 99
	fmt.Println(arr) // [1 2 99 4 5]
	//切片可以动态增长
	var arr1 [6]int = [6]int{2,56,78,5,99}
	var slice3 []int = arr1[1:4] //[56 78 5]
	fmt.Println(len(slice3)) //3
	slice4 := append(slice3,88,50)
	fmt.Println(slice4) //[56 78 5 88 50]
	fmt.Println(slice3) //[56 78 5]
	slice3 = append(slice3,55,66)
	fmt.Println(slice3) //[56 78 5 55 66]
	//底层原理：
	//1.底层追加元素的时候对数组进行扩容，老数组扩容为新数组：
	//2.创建一个新数组，将老数组中的4,7,3复制到新数组中，在新数组中追加88,50
	//3.slice2 底层数组的指向 指向的是新数组 
	//4.往往我们在使用追加的时候其实想要做的效果给slice追加
	//5.底层的新数组 不能直接维护，需要通过切片间接维护操作。
	//通过append函数将切片追加给切片

	//6.切片的拷贝
	var a []int = []int{1,5,6,97,5}
	var b []int = make([]int,10)
	copy(b,a) 
	fmt.Println(b) //[1 5 6 97 5 0 0 0 0 0]
}